﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace test01
{
    public interface IMyInterface
    {
        int add(int a,int b);
        int sub(int a, int b);
    }
    public class InterfaceImpIementer : IMyInterface
    {
        public int add(int a, int b)
        {
            return a + b;
        }
        public int sub(int a, int b)
        {
            return a - b;
        }
    }
    public class Num
    {
        public int add(int num1, int num2)
        {
            return num1 + num2;
        }
    }
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //Application.EnableVisualStyles();
            //Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            Console.Write("hello world");
            Console.WriteLine("hello C#");
            Console.WriteLine("int : {0}",sizeof(int));
            object obj;
            obj = 100;
            Console.WriteLine("obj : {0}", obj);
            dynamic s = "123";
            Console.WriteLine("dynamic : {0}", s);
            string a = "hello \t world";
            string b = @"hello \t world";
            Console.WriteLine("{0} , {1}", a, b);
            //@符号可以让字符串不在转义
            //运算符 is判断对象是否为某一类型。if(Ford is Car) 检查Ford是否是Car类的一个对象
            //as 强制类型转换 不会抛异常
            int[] array = new int[] { 0, 1, 2, 3, 4, 5 };
            foreach(int i in array)
            {
                Console.WriteLine(i);
            }
            //Internal 访问说明符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说，带有 internal 
            //访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
            Num n = new Num();
            Console.WriteLine(n.add(12, 114));
            int? c = null;
            int? d = c ?? 4;//如果c == null 那么d就等于4
            //C# 不支持多重继承
            /*
C# 允许您使用关键字 abstract 创建抽象类，用于提供接口的部分类的实现。
             * 当一个派生类继承自该抽象类时，实现即完成。抽象类包含抽象方法，抽象方法可被派生类实现。派生类具有更专业的功能。
请注意，下面是有关抽象类的一些规则：
您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed，可以将类声明为密封类。当一个类被声明为 sealed 时，它不能被继承。抽象类不能被声明为 sealed。
             */

            InterfaceImpIementer temp = new InterfaceImpIementer();
            Console.WriteLine(temp.add(1, 2));
            Console.WriteLine(temp.sub(1, 2));
            
        }
    }
}
